package es.ikex.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.Map;

import com.sun.org.apache.bcel.internal.generic.CPInstruction;

import es.ikex.modelo.Cliente;
import es.ikex.modelo.Producto;

public class ProductosDAO extends ConexionDAO{

	public ProductosDAO() {
		// TODO Auto-generated constructor stub
	}
	
	public Collection<Producto> getTipoProductos(){
		Collection<Producto> lista = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select * from v_categorias");
			
			while(resultado.next()){

				Producto producto = new Producto();
				
				producto.setCodigo(resultado.getString("CodigoCategoria") + resultado.getString("CodigoColeccion"));
				producto.setCategoria(resultado.getString("NombreCategoria"));
				producto.setColeccion(resultado.getString("NombreColeccion"));
				
				lista.add(producto);
				
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return lista;
	}
	
	public Collection<Producto> getProductos(String where){
		Collection<Producto> lista = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			resultado = estamento.executeQuery
				("select Codigo, NombreCategoria, NombreColeccion, Concepto, Descripcion, Alto, Ancho, Profundidad, Precio, Foto, Stock " +
						"from v_productos " + where);
			while(resultado.next()){
				Producto producto = new Producto();

				producto.setCodigo(resultado.getString("Codigo"));
				producto.setCategoria(resultado.getString("NombreCategoria"));
				producto.setColeccion(resultado.getString("NombreColeccion"));
				producto.setConcepto(resultado.getString("Concepto"));
				producto.setDescripcion(resultado.getString("Descripcion"));
				producto.setAlto(resultado.getString("Alto"));
				producto.setAncho(resultado.getString("Ancho"));
				producto.setProfundidad(resultado.getString("Profundidad"));
				producto.setPrecio(resultado.getString("Precio"));
				producto.setFoto(resultado.getString("Foto"));
				producto.setStock(Integer.parseInt(resultado.getString("Stock")));
				
				lista.add(producto);
				
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return lista;
	}
	
	public Collection<Producto> getProductosDescatalogatos(){
		Collection<Producto> lista = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			resultado = estamento.executeQuery
				("select * " +
						"from productos where FueraCatalogo='S'");

			while(resultado.next()){
				
				Producto producto = new Producto();
				
				producto.setFechaIntro(resultado.getString("FechaIntro"));
				producto.setCodigo(resultado.getString("Codigo"));
				producto.setConcepto(resultado.getString("Concepto"));
				producto.setAlto(resultado.getString("Alto"));
				producto.setAncho(resultado.getString("Ancho"));
				producto.setProfundidad(resultado.getString("Profundidad"));
				producto.setPrecio(resultado.getString("Precio"));
				producto.setFoto(resultado.getString("Foto"));
				producto.setStock(Integer.parseInt(resultado.getString("Stock")));
				
				lista.add(producto);
				
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return lista;
	}
	
	public Collection<Producto> getProductosBusqueda(String where){
		Collection<Producto> lista = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			resultado = estamento.executeQuery("select codigo from productos " + where);
			while(resultado.next()){
				Producto a = new Producto();
				a = getClaseProductos(resultado.getString("codigo"));
				System.out.println(a.getAlto());
				if(a.getAlto()!= null)
					lista.add(a);
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return lista;
	}
	
	public Producto getClaseProductos(String codigo){
		Producto producto = new Producto();
		try {
			getConexion();
			
			estamento = conexion.createStatement();
			resultado = estamento.executeQuery
			("select Codigo, NombreCategoria, NombreColeccion, Concepto, Descripcion, Alto, Ancho, Profundidad, Precio, Foto, Stock" +
					" from v_productos where Codigo='" + codigo + "'");
			while(resultado.next()){
				
				producto.setCodigo(resultado.getString("Codigo"));
				producto.setCategoria(resultado.getString("NombreCategoria"));
				producto.setColeccion(resultado.getString("NombreColeccion"));
				producto.setConcepto(resultado.getString("Concepto"));
				producto.setDescripcion(resultado.getString("Descripcion"));
				producto.setAlto(resultado.getString("Alto"));
				producto.setAncho(resultado.getString("Ancho"));
				producto.setProfundidad(resultado.getString("Profundidad"));
				producto.setPrecio(resultado.getString("Precio"));
				producto.setFoto(resultado.getString("Foto"));
				producto.setStock(Integer.parseInt(resultado.getString("Stock")));
			}

		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return producto;
	}
	
	public Collection<Producto> getBusqueda(String buscar){
		Collection<Producto> busqueda = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select Codigo, NombreCategoria, NombreColeccion, Concepto, Descripcion, Alto, Ancho, Profundidad, Precio, Foto " +
						"from v_productos where concepto='" + buscar + "'");
			
			while(resultado.next()){

				Producto producto = new Producto();

				producto.setCodigo(resultado.getString("Codigo"));
				producto.setCategoria(resultado.getString("NombreCategoria"));
				producto.setColeccion(resultado.getString("NombreColeccion"));
				producto.setConcepto(resultado.getString("Concepto"));
				producto.setDescripcion(resultado.getString("Descripcion"));
				producto.setAlto(resultado.getString("Alto"));
				producto.setAncho(resultado.getString("Ancho"));
				producto.setProfundidad(resultado.getString("Profundidad"));
				producto.setPrecio(resultado.getString("Precio"));
				producto.setFoto(resultado.getString("Foto"));
				
				busqueda.add(producto);
				
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return busqueda;
	}
	
	public void masStock(String codigo, int numero){
		
		getConexion();
		try {
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select stock from productos where codigo='" + codigo + "'");
			
			while(resultado.next()){
				preparada = conexion.prepareStatement("update productos set stock=? where Codigo=?");
				int n = 0;
				n = Integer.parseInt(resultado.getString("stock"));
				n += numero;
				
				preparada.setInt(1, n);
				preparada.setString(2, codigo);
				preparada.executeUpdate();
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void menosStock(String codigo, int numero){
		
		getConexion();
		try {
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select stock from v_productos where codigo='" + codigo + "'");
			
			while(resultado.next()){
				preparada = conexion.prepareStatement("update productos set stock=? where Codigo=?");
				int n = 0;
				n = Integer.parseInt(resultado.getString("stock"));
				n -= numero;
				
				preparada.setInt(1, n);
				preparada.setString(2, codigo);
				preparada.executeUpdate();
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public float getBaseImponible(String codigo, int numero){
		
		float n = 0f;
		getConexion();
		try {
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select Precio from v_productos where codigo='" + codigo + "'");
			
			while(resultado.next()){
			
				n = Float.parseFloat(resultado.getString("Precio"));
				n *= numero;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return n;
	}
	public Collection<Producto> getCategorias(){
		Collection<Producto> lista = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select * from categorias");
			
			while(resultado.next()){

				Producto producto = new Producto();

				
				producto.setCategoria(resultado.getString("Nombre"));
				producto.setCodigo(resultado.getString("Codigo"));
				
				lista.add(producto);
				
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return lista;
	}
	public Collection<Producto> getColecciones(String categoria){
		Collection<Producto> lista = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select CodigoColeccion, NombreColeccion from v_categorias where CodigoCategoria='"+categoria+"'");
			while(resultado.next()){

				Producto producto = new Producto();

				
				producto.setColeccion(resultado.getString("NombreColeccion"));
				producto.setCodigo(resultado.getString("CodigoColeccion"));
				
				lista.add(producto);
				
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return lista;
	}
	
	public Collection<Producto> getColecciones(){
		Collection<Producto> lista = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select * from categorias");
			while(resultado.next()){

				Producto producto = new Producto();

				
				producto.setColeccion(resultado.getString("Nombre"));
				producto.setCodigo(resultado.getString("Codigo"));
				
				lista.add(producto);
				
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return lista;
	}
	
	public Collection<Producto> getTodasColecciones(String categoria){
		Collection<Producto> lista = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();

			resultado = estamento.executeQuery
				("select * from v_categorias where CodigoCategoria='"+categoria+"'");
			if(!resultado.next()){
				resultado = estamento.executeQuery
						("select * from colecciones");
				while(resultado.next()){
						Producto producto = new Producto();
						
					producto.setColeccion(resultado.getString("Nombre"));
					producto.setCodigo(resultado.getString("Codigo"));
					
					lista.add(producto);
			
				}
			}else{
				do{
					if(resultado.getString("NombreColeccion").equalsIgnoreCase("Coleccion unica")){
						Producto producto = new Producto();
	
						
						producto.setColeccion(resultado.getString("NombreColeccion"));
						producto.setCodigo(resultado.getString("CodigoColeccion"));
						
						lista.add(producto);
					}
					else{
						resultado = estamento.executeQuery
								("select * from colecciones");
						while(resultado.next()){
							
							if(!resultado.getString("Nombre").equalsIgnoreCase("Coleccion unica")){
								Producto producto = new Producto();
									
								producto.setColeccion(resultado.getString("Nombre"));
								producto.setCodigo(resultado.getString("Codigo"));
								
								lista.add(producto);
							}
					
						}
					}
			}while(resultado.next());
		}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return lista;
	}
	
	public String getCodigo(String cod){
		String codigo = "";
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select max(codigo) as max_codigo from productos where codigo like '"+cod+"%'");
			
			while(resultado.next()){
				codigo = resultado.getString("max_codigo");
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return codigo;
	}
	
	public void crearProducto(Map<String, String> datos) {
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			preparada = conexion.prepareStatement("insert into productos " +
					"(Codigo, Concepto, Descripcion, CodigoProveedor, Precio, Stock, StockMinimo, Foto,  FueraCatalogo, Alto, Ancho, Profundidad, FechaIntro) " +
					"values(?,?,?,?,?,?,?,?,?,?,?,?,?)");
			preparada.setString(1, datos.get("codigo"));
			preparada.setString(2, datos.get("concepto"));
			preparada.setString(3, datos.get("descripcion"));
			preparada.setInt(4,Integer.parseInt(datos.get("proveedores")));
			preparada.setFloat(5, Float.parseFloat(datos.get("precio")));
			preparada.setInt(6,Integer.parseInt(datos.get("stock")));
			preparada.setInt(7,Integer.parseInt(datos.get("stockMinimo")));
			preparada.setString(8, datos.get("foto"));
			preparada.setString(9, "N");
			preparada.setFloat(10, Float.parseFloat(datos.get("alto")));
			preparada.setFloat(11, Float.parseFloat(datos.get("ancho")));
			preparada.setFloat(12, Float.parseFloat(datos.get("profundidad")));
			Calendar calendario = GregorianCalendar.getInstance();
			java.util.Date fecha = calendario.getTime();
			SimpleDateFormat formatoDeFecha = new SimpleDateFormat("yyyy-MM-dd");
			preparada.setString(13, formatoDeFecha.format(fecha));

			preparada.executeUpdate();
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
	}
	public Collection<Producto> getBusquedaProducto(String where){
		Collection<Producto> busqueda = new ArrayList<Producto>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select * from productos " + where);
			
			while(resultado.next()){

				Producto producto = new Producto();

				producto.setCodigo(resultado.getString("Codigo"));
				producto.setConcepto(resultado.getString("Concepto"));
				producto.setDescripcion(resultado.getString("Descripcion"));
				producto.setAlto(resultado.getString("Alto"));
				producto.setAncho(resultado.getString("Ancho"));
				producto.setProfundidad(resultado.getString("Profundidad"));
				producto.setPrecio(resultado.getString("Precio"));
				producto.setStock(resultado.getInt("Stock"));
				producto.setStockMinimo(resultado.getInt("StockMinimo"));
				producto.setProveedor(resultado.getString("CodigoProveedor"));
				producto.setFueraCatalogo(resultado.getString("FueraCatalogo"));
				busqueda.add(producto);
				System.out.println(" foto  " + producto.getFoto());
				
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return busqueda;
	}
	
	public void editarProducto(String codigo, String concepto, String descripcion, int codigoProveedores, float precio, int stock, int stockMinimo, String fueraCatalogo, float alto, float ancho, float profundidad){
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			preparada = conexion.prepareStatement("update productos " +
					" set Concepto=?, Descripcion=?, CodigoProveedor=?, Precio=?, Stock=?, StockMinimo=?,  FueraCatalogo=?, Alto=?, Ancho=?, Profundidad=? " +
					" where codigo='"+codigo+"'");
			
			preparada.setString(1, concepto);
			preparada.setString(2, descripcion);
			preparada.setInt(3, codigoProveedores);
			preparada.setFloat(4,precio);
			preparada.setInt(5, stock);
			preparada.setInt(6,stockMinimo);
			preparada.setString(7, fueraCatalogo);
			preparada.setFloat(8, alto);
			preparada.setFloat(9, ancho);
			preparada.setFloat(10, profundidad);

			preparada.executeUpdate();
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
	}
	public void editarCategoria(String codigoOld, String codigoNew){
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			preparada = conexion.prepareStatement("update productos " +
					" set Codigo=?" +
					" where codigo='"+codigoOld+"'");
			
			preparada.setString(1, codigoNew);


			preparada.executeUpdate();
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
	}

	public void descatalogarProducto(String codigo, String si){
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			preparada = conexion.prepareStatement("update productos set fueraCatalogo=?" +
					" where codigo='"+codigo+"'");
			
			preparada.setString(1, si);
			preparada.executeUpdate();
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
	}
	
	public String getFoto(String codigo){
		String a = "";
		try {
			getConexion();
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery
				("select Foto from productos where codigo='" + codigo + "'");
			
			while(resultado.next()){

				a = resultado.getString("Foto");
				
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return a;
	}
	
	public int fueraStock(){
		int cantidad = 0;
		try{
			getConexion();
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery("select count(*) as fueraStock from productos where Stock<=StockMinimo");
			
			while(resultado.next()){
				cantidad = resultado.getInt("fueraStock");
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		return cantidad;
	}
	
	public Collection<Producto> mostrarFueraStock(){
		Collection<Producto> producto = new ArrayList<Producto>();
		try{
			getConexion();
			estamento = conexion.createStatement();
			
			resultado = estamento.executeQuery("select Codigo, Concepto, Foto, Stock, StockMinimo, Precio from productos where Stock<=StockMinimo");
			
			while(resultado.next()){
				Producto p = new Producto();
				
				p.setCodigo(resultado.getString("Codigo"));
				p.setConcepto(resultado.getString("Concepto"));
				p.setFoto(resultado.getString("Foto"));
				p.setStock(resultado.getInt("Stock"));
				p.setStockMinimo(resultado.getInt("StockMinimo"));
				p.setPrecio(resultado.getString("Precio"));
				
				producto.add(p);
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		return producto;
	}
}
